package 字符串.反转字符串II_541;
/*
给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个，则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。

示例 1：
输入：s = "abcdefg", k = 2
输出："bacdfeg"

示例 2：
输入：s = "abcd", k = 2
输出："bacd"

提示：
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104

思路：
        其实只有两种情况，即取2k字符前，先判断字符少于k还是大于或等于 k 个，2k的条件作为for循环即可，有一段规律的字符
      在for循环上做工作就行
* */
public class Solution {
    public static void main(String[] args) {
        String s = "abcdefg";
        int k = 2;
        System.out.println(reverseStr(s, k));
    }
    public static String reverseStr(String s, int k) {
        char[] str = s.toCharArray();
        int len = str.length;
        for (int i = 0; i < len; i += 2 * k){
            // 如果此时是 k < len(剩下) < 2k 则反转前k个字符
            if (i + k <= len){
                reverse(str, i, i + k - 1);
                continue;
            }
            // 如果此时len(剩下)少于k个字符
            reverse(str,i, len - 1);
        }
        return new String(str);
    }
    public static void reverse(char[] chars, int x, int y){
        if (chars.length <= 1){
            return ;
        }
        int l = x, r = y;
        while (l < r){
            char temp = chars[l];
            chars[l] = chars[r];
            chars[r] = temp;
            l ++;
            r --;
        }
    }
}
